{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数值微分\n",
    "#### 导数的定义式\n",
    "$$\n",
    "\\frac {df(x)}{dx} = \\lim_{h \\to 0 } \\frac {f(x+h) -f(x)}{h}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 不好的实现示例\n",
    "def numerical_diff(f, x): # 数值微分 numerical differentition\n",
    "    h = 10e-50 # 存在舍入误差，应当改为 10e-4\n",
    "    return (f(x+h)-f(x) / h) # 由于h不可能无限接近0，所以计算有误差，可以修改为 (f(x+h) - f(x-h)) / (2*h)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.0\n",
      "1e-04\n"
     ]
    }
   ],
   "source": [
    "# 舍入误差\n",
    "import numpy as np\n",
    "\n",
    "print(np.float32(1e-50)) # 产生舍入误差\n",
    "print(np.float32(1e-4))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数值微分的实现\n",
    "def numercial_diff(f, x):\n",
    "    h = 1e-4 # 0.0001\n",
    "    return (f(x+h) - f(x-h)) / (2*h)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 数值微分的例子\n",
    "我们定义这个函数：$f(x) = 0.01x^2 + 0.1x$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def function_1(x): # f(x) = 0.01x^2 + 0.1x\n",
    "    return 0.01*x**2 + 0.1*x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来，我们绘制这个函数的图像。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as numpy\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "x = np.arange(0.0, 20.0, 0.1) # 以0.1为单位，从0到20的数组x\n",
    "y = function_1(x)\n",
    "plt.xlabel(\"x\")\n",
    "plt.ylabel(\"f(x)\")\n",
    "plt.plot(x, y)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们来计算一下这个函数在 x=5 和 x=10 处的导数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.1999999999990898"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "numercial_diff(function_1, 5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.2999999999986347"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "numercial_diff(function_1, 10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "利用上面的数值微分的值作为斜率，画一条直线。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-7.5e+48\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAERCAYAAABl3+CQAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3debzWc/7/8cerTmkhLU6kjIoGMZZc0kJCUaGyTiEh0oYxDBnLGIyxzBhjtEhFWQpZKqINiZROWROKLJE61qylev3++Fy+v+O4ztWpc67rfS3P++123c51XZ/3ua6nzzmdp8/n+nzeH3N3REREylIldAAREclsKgoREUlKRSEiIkmpKEREJCkVhYiIJKWiEBGRpHK2KMxsrJmtMbM3yzH2TDMrNrNX47dzSizra2bL4re+qU0tIpJ5LFfPozCzDsB3wHh332czY88EYu4+pNTz9YEiIAY4sAg40N2/SkloEZEMlLNbFO7+PPBlyefMbDcze9rMFpnZXDPbczMvczQw092/jJfDTKBLiiKLiGSknC2KMowCznf3A4FLgOEllp1oZq+b2SQz2yX+XGPg4xJjVsafExHJGwWhA6SLmW0LtAMeNrNfnt4m/nUqMMHd15nZAGAccARgv3mhaBeUiEjeyJuiINp6+trd9y+9wN2/KPHwLuCm+P2VQMcSy5oAz6Uon4hIRsqbXU/uvhZYYWYnA1hkv/j9RiWGdgeWxu9PB44ys3pmVg84Kv6ciEjeyNktCjObQLQ1sIOZrQT+BpwGjDCzK4FqwETgNeACM+sObCD6APxMAHf/0syuAxbGX/Zad//VB+QiIrkuZw+PFRGRypE3u55ERGTr5OSupx122MGbNm0aOoaISNZYtGjR5+5emGhZThZF06ZNKSoqCh1DRCRrmNmHZS3TricREUlKRSEiIkkFLQoz62Jm75jZcjMbmmTcQWa20cxOSmc+EREJWBRmVhUYBnQFWgK9zaxlGeNuQie6iYgEEXKLojWw3N3fd/f1RCe/9Ugw7nzgEWBNOsOJiEgkZFFsdmZWM2sMHA+M3NyLmVl/Mysys6Li4uJKDSoiks9CFkV5Zma9DbjM3Tdu7sXcfZS7x9w9VliY8FBgERHZCiHPo1gJ7FLicRPg01JjYsDE+LTgOwDdzGyDuz+ekkRzbobdj4TGB6bk5UVEslHILYqFQAsza2Zm1YFewJSSA9y9mbs3dfemwCRgUMpK4ocvoehuGN0JZlwJ639IyduIiGSbYEXh7huAIURHMy0FHnL3JWY2IH7xoPSqVR8Gz4dWZ8C8/8HI9rBibtpjiIhkmpycPTYWi3mFpvBY8TxMuQC+WgEHngWd/w41tq+8gCIiGcbMFrl7LNEynZmdSLMOMHAetB0Ci8fBsDbwztOhU4mIBKGiKEv1WnD0P6DfLKhZFyb8ESb1g+8/D51MRCStVBSb0+RA6D8HOl4Ob02GYa3hjUmQg7vsREQSUVGUR0F16DgUznse6jWFR/rBhF7wzSehk4mIpJyKYkvs2BL6zYSjb4D358DwNtEhtZs2hU4mIpIyKootVaUqtB0Mg+ZBo/3giT/B+O7wxXuhk4mIpISKYmvVbw59p8Jxt8Oq12BEO3jxdti4IXQyEZFKpaKoCDM4sC8MXgDND4eZV8GYzrB6SehkIiKVRkVRGersDL0nwElj4euP4M4O8OwNsGFd6GQiIhWmoqgsZrDPiTD4Zdj7BJhzE9x5GKyswBniIiIZQEVR2Wo3gBPvglMfgnVro0kGn/4rrP8+dDIRka2iokiV3x8Ng+ZD7GyYPwyGt4X3nwudSkRki6koUqlGHTj2Vjjzyeiw2vE9YMr58OPXoZOJiJSbiiIdmh4STTLY/kJ45T4YdjC8/WToVCIi5aKiSJdqNaHztXDObKjVACaeCg+fBd/p+t4iktlUFOnWuBX0fw4OvxLefgKGHQSvPahJBkUkY6koQiioDof9Bc6bCw12h8f6wwOnwDcrQycTEfmNoEVhZl3M7B0zW25mQxMsP83MXo/f5pnZfiFypkzDPeHs6dDlRvjgheizi4WjNcmgiGSUYEVhZlWBYUBXoCXQ28xalhq2AjjM3fcFrgNGpTdlGlSpCm0GwqCXoEkMnrwY7jkGPl8eOpmICBB2i6I1sNzd33f39cBEoEfJAe4+z92/ij+cDzRJc8b0qdcU+jwO3e+I5ooa2R5euE2TDIpIcCGLojHwcYnHK+PPlaUf8FRZC82sv5kVmVlRcXGWHklkBq36RJMM7t4JZv0NRh8Bn70ROpmI5LGQRWEJnkt46I+ZHU5UFJeV9WLuPsrdY+4eKywsrKSIgdRpBH+8D04eB2s/hVEd4ZnrNcmgiAQRsihWAruUeNwE+LT0IDPbFxgN9HD3L9KULTwz2LtnNMngH06G52+BkYfCRwtCJxORPBOyKBYCLcysmZlVB3oBU0oOMLPfAY8Cfdz93QAZw6tVH44fCac9Aj//AGOPhqcug3XfhU4mInkiWFG4+wZgCDAdWAo85O5LzGyAmQ2ID7saaAAMN7NXzSx/5+xu0Sk6Muqgc2DBSBjRFt57JnQqEckD5jl4RnAsFvOiohzulA/nRZMLfrEc9j8djr4eatYLnUpEspiZLXL3WKJlOjM7G+3aDga8CIf8GV6bEJ2ot3Rq6FQikqNUFNmqWg3o9Dc49xnYtiE8eDo8dAZ8uzp0MhHJMSqKbLfz/nDus3Dk1fDO0zCsNbz6gCYZFJFKo6LIBVWrwaEXw4AXoHAPeHwg3HcifP1R6GQikgNUFLmk8Pdw1tPQ9Rb4aD4MawMLRmmSQRGpEBVFrqlSBQ7uD4Pnw+/awFN/gbu7wufLQicTkSyloshVdX8Hpz8CPUdA8dswoj3M/Tds/Dl0MhHJMiqKXGYG+58aTQOyRxeYfS3cdTisei10MhHJIiqKfLDdjnDKeDjl3ujw2VGHw6xr4OefQicTkSygosgnLbvDkJdhv97wwn+ia158+FLoVCKS4VQU+aZmPeg5DE5/FDash7u7wJOXwLpvQycTkQyloshXux8ZTTJ48IDoOt3D28LyWaFTiUgGUlHks222ha43wdnToVrN6CS9xwbAD1+GTiYiGURFIfC7g+G8uXDoJfDGw9E0IEse1zQgIgKoKOQX1WrAkVdF80bV2Rke7htNNPjtZ6GTiUhgKgr5tUb7wjnPQKdrYNnMaOvilfu0dSGSx1QU8ltVC+CQi2DgPGi4N0weDPf2hK8+CJ1MRAJQUUjZdtgdznwSjvk3rCyKjoyaPxI2bQydTETSKGhRmFkXM3vHzJab2dAEy83Mbo8vf93MWoXImdeqVImu0z1oPuzaHp6+DMZ2geJ3QicTkTQJVhRmVhUYBnQFWgK9zaxlqWFdgRbxW39gRFpDyv9Xdxc47WE4fhR8sQxGHgJzbtEkgyJ5oCDge7cGlrv7+wBmNhHoAbxVYkwPYLy7OzDfzOqaWSN3X5WKQH+fuoS3Pl2bipfOIb+jznYjOGvtcNo9ez0fzr2fEXX/zIpqLUIHE8l7LXeuw9+O27vSXzfkrqfGwMclHq+MP7elYwAws/5mVmRmRcXFxZUaVH5tbdW6/LfeX7ml3tVst+kbbvj8Qk5dO4Zqvi50NBFJgZBbFJbgudLHYJZnTPSk+yhgFEAsFtuqYzlT0cS5rS382A9mXkWPxePpsc1i6P4/aNo+dDARqUQhtyhWAruUeNwE+HQrxkhINetG5XDGZNi0Ae7pBk/8GX7SLjyRXBGyKBYCLcysmZlVB3oBU0qNmQKcET/6qQ3wTao+n5AKat4xmmSwzWAoGhsdSvvujNCpRKQSBCsKd98ADAGmA0uBh9x9iZkNMLMB8WHTgPeB5cBdwKAgYaV8qteGLjdAv5nRhIMPnAyP9ofvvwidTEQqwDwHp2aIxWJeVFQUOkZ+27Auukb33H9DjbrQ7WbY+4To8qwiknHMbJG7xxIt05nZkhoF28Dhf4X+c6JzMCadDRNPhbXacyiSbVQUklo77QP9ZkHn6+C9Z2DYwbBonCYZFMkiKgpJvaoF0P6CaJLBnf4AUy+A8d3hyxWhk4lIOagoJH0a7AZ9p8Kxt8Enr0RHRr00TJMMimQ4FYWkV5UqEDsLBi+AZh1g+l9hTGdY/dbmv1dEglBRSBjbN4ZTH4QTx0TXubizAzx3I2xYHzqZiJSiopBwzOAPJ8Hgl2HvnvDcP2HUYfDJotDJRKQEFYWEV3sHOHE09J4IP34NozvB9Ctg/Q+hk4kIKgrJJHt0hcHzoVVfeOkOGNEOVswNnUok76koJLPU2B6Ouy06Ogpg3LEw9UL46ZuwuUTymIpCMlOzDtF5F+3Oh8XjoxP13nkqdCqRvKSikMxVvRYcdX10ZnfNejChF0zqB99/HjqZSF5RUUjma3JgNGdUx7/CW5PhjoPg9Yc1DYhImqgoJDsUVIeOl8GAuVC/OTx6TrSF8c0noZOJ5DwVhWSXhntBvxlw9A3w/pzos4uisbBpU+hkIjlLRSHZp0pVaDs4uqJe4wPgiYuiSQa/eC90MpGcpKKQ7FW/GZwxBY67HVa9Fp138eLtsHFD6GQiOSVIUZhZfTObaWbL4l/rJRizi5k9a2ZLzWyJmV0YIqtkODM4sG80yeBuR8DMq2BMJ/jszdDJRHJGqC2KocBsd28BzI4/Lm0DcLG77wW0AQabWcs0ZpRsUmdn6PUAnHQ3fP1xNGfUszdEl2QVkQoJVRQ9gHHx++OAnqUHuPsqd18cv/8tsBRonLaEkn3MYJ8TYMhC2OdEmHNTNCvtxwtDJxPJaqGKYkd3XwVRIQANkw02s6bAAcCCJGP6m1mRmRUVFxdXYlTJOrXqwwmj4NSHYd230fUunv4rrP8+dDKRrJSyojCzWWb2ZoJbjy18nW2BR4A/ufvassa5+yh3j7l7rLCwsKLxJRf8/igYNB9iZ8P8YdEV9d5/LnQqkayTsqJw907uvk+C22RgtZk1Aoh/XZPoNcysGlFJ3O/uj6Yqq+SwGnXg2FvhzGlQpQDG94DJQ6LpzEWkXELtepoC9I3f7wtMLj3AzAwYAyx191vTmE1yUdP2MPBFaP8nePWB6ES9t58MnUokK4QqihuBzma2DOgcf4yZ7Wxm0+Jj2gN9gCPM7NX4rVuYuJITqtWEzn+Hc2dD7UKYeCo8fCZ8l3CDVkTizHNwYrVYLOZFRUWhY0gm2/gzvHgbzLkZqteGLjfBvqdER06J5CEzW+TusUTLdGa25Keq1aDDX2DAC9CgBTzWH+4/OToHQ0R+RUUh+a1wDzj76WiL4sMXYXgbePkuTTIoUoKKQqRKVWgzIJpksMlBMO0SuOcY+Hx56GQiGUFFIfKLek2hz2PQYzisWRJNMvjCfzTJoOQ9FYVISWZwwGkw+GVo0RlmXQOjj4DP3gidTCQYFYVIItvtBL3uh1PGw9pVMKojzL4Ofv4pdDKRtFNRiCTTskc0hfkfToG5/4I7D4WPypxyTCQnqShENqdWfTh+BJz+CPz8I4w9GqZdCuu+C51MJC1UFCLltXun6Mio1ufCy6OiSQaXzw6dSiTlVBQiW2Kb7aDbLXDWU1CwDdx3Ajw+CH78KnQykZRRUYhsjV3bRmd1H/JneG1iNMngW1NCpxJJCRWFyNaqVgM6/Q36PwvbNoSH+sCDfeDb1aGTiVSqchWFmTU0s+PNbLCZnW1mrc1MJSMC0Gg/OPdZOPJqeHc6DGsdTWWegxNuSn5K+sfezA43s+nAk0BXoBHQErgSeMPM/m5mdVIfUyTDVa0Gh14c7Y4q3BMeHxh9fvHVh6GTiVRYwWaWdwPOdfePSi8wswLgWKLrSTySgmwi2afw99EH3UVjorO6h7eNdk8ddC5U0Ua4ZCddj0IkVb7+CKb+Cd6bDbu0ge7/i4pEJANV+HoUZnavmW1f4nFTM9MB5CLJ1P1ddJJez5FQ/DaMbA/P/yu6aJJIFinvtvALwAIz62Zm5wIzgNtSF0skR5jB/r1hyELYoys8cx3cdTh8+mroZCLlVq6icPc7gXOAycC1QAd3n7q1b2pm9c1sppkti3+tl2RsVTN7xcye2Nr3Ewlu24bRBIOn3Btdo/uuI6LPMH7+MXQykc0q766nPsBY4AzgHmCame1XgfcdCsx29xbA7PjjslwILK3Ae4lkjpbdo0kG9+8dXeti5CHw4UuhU4kkVd5dTycCh7j7BHe/HBhAVBhbqwcwLn5/HNAz0SAzawIcA4yuwHuJZJaa9aDHMOjzOGxcD3d3gScvgXXfhk4mklB5dz31dPc1JR6/DBxcgffd0d1XxV9rFdCwjHG3AZcCm72AsZn1N7MiMysqLi6uQDSRNNntcBj4Ehw8EBaOjg6lXTYrdCqR39jcCXdXmln9RMvcfb2ZHWFmx5bxvbPM7M0Etx7lCRZ/3TXuvqg84919lLvH3D1WWFhYnm8RCW+bbaHrjdBvBlSrBfefCI8NgB++DJ1M5P9s7oS7N4CpZvYTsBgoBmoALYD9gVnADYm+0d07lfWiZrbazBq5+yozawSsSTCsPdDdzLrF37OOmd3n7qdv7j9KJOvs0hoGzIXnb4k+u1g+K5qltmXP6MgpkYA2t+vpJHdvD0wHlgBVgbXAfUBrd7/I3bdmP88UoG/8fl+io6l+xd0vd/cm7t4U6AU8o5KQnFawDRxxJfR/Duo0hofPhAdPh28/CxxM8t3miuJAM9sVOI3oj/udwHhgIVCzAu97I9DZzJYRTQFyI4CZ7Wxm0yrwuiLZb6c/wDmzofO10ZbFHa1h8b2aZFCCSTqFh5ldAAwEmgOflFwEuLs3T228raMpPCRnfL4cpl4AH74IzTvCcf+Fek0Dh5JctNVTeLj77e6+FzDW3ZuXuDXL1JIQySk77A59n4BjboWVi6Ijo+aPgE0bQyeTPFLew2MHpjqIiJShShU4qB8Mng+7toenh8LYLrDm7dDJJE9o3mORbLF9EzjtYTjhLvhiOdx5KMy5BTasD51McpyKQiSbmMG+p8Dgl2Gv4+DZ66NJBj9ZHDqZ5DAVhUg22rYQThoLvSbAD1/A6CNhxlWaZFBSQkUhks327AaD5sMBfWDe7TCiHXzwQuhUkmNUFCLZrmZd6H47nDEFfBPccww8cRH8tDZ0MskRKgqRXNH8MBg4D9oOgUX3wPA28O6M0KkkB6goRHJJ9dpw9D+g30zYZjt44GR45Fz4/ovQySSLqShEclGTGJz3PBw2FJY8BsMOgjcmaRoQ2SoqCpFcVbANHH45nDcH6u4Kj/SDiafC2k9DJ5Mso6IQyXU77g3nzIKjrof3noVhB0efYWjrQspJRSGSD6pUhXbnw8AXodF+MPVCGHccfPl+6GSSBVQUIvmkwW7RYbTH3garXoPh7WDeHZpkUJJSUYjkmypVIHZWdKJe88NgxhUwpjOsfit0MslQKgqRfLV9Y+g9EU4cA199AHd2gOdu1CSD8hsqCpF8ZgZ/OAkGL4S9e8Jz/4RRh0XXvhCJC1IUZlbfzGaa2bL413pljKtrZpPM7G0zW2pmbdOdVSQv1G4AJ46G3g/Cj1/DmE4w/QpY/0PoZJIBQm1RDAVmu3sLYHb8cSL/BZ529z2B/YClaconkp/26BJdIKlVX3jpDhjRFlY8HzqVBBaqKHoA4+L3xwE9Sw8wszpAB2AMgLuvd/ev05ZQJF/V2B6Ouy26BCsWHUY79UL46ZvQySSQUEWxo7uvAoh/bZhgTHOgGLjbzF4xs9FmVrusFzSz/mZWZGZFxcXFqUktkk+aHRpNMtjuAlg8PjpR752nQqeSAFJWFGY2y8zeTHDrUc6XKABaASPc/QDge8reRYW7j3L3mLvHCgsLK+G/QESoXguOug7OmQ0168OEXjDpbPj+89DJJI0KUvXC7t6prGVmttrMGrn7KjNrBKxJMGwlsNLdF8QfTyJJUYhICjVuBf2fgxdvgzk3R1OBdL05OmLKLHQ6SbFQu56mAH3j9/sCk0sPcPfPgI/NbI/4U0cCOiNIJJSC6nDYpTBgLtRvDo+eAw/8Eb5ZGTqZpFioorgR6Gxmy4DO8ceY2c5mNq3EuPOB+83sdWB/4Ia0JxWRX2u4F/SbAUf/Ez6YC8PaQNFY2LQpdDJJEfMcnEEyFot5UVFR6Bgiue/LFdERUSvmwK6HRJdkbbBb6FSyFcxskbvHEi3TmdkisvXqN4MzJkP3/8Fnb8CIdvDif2HjhtDJpBKpKESkYsyg1RkweAHsdiTMvDo6s/uzN0Mnk0qiohCRylGnEfS6H06+J/qAe9Rh8Mw/YMO60MmkglQUIlJ5zGDv42Hwy7DPSfD8zdGstB8vDJ1MKkBFISKVr1Z9OOFOOG0SrPsuut7F05fD+u9DJ5OtoKIQkdRp0RkGvQQH9YP5w2F42+hkPckqKgoRSa0adeCYf8NZT0GVAri3J0weHE1nLllBRSEi6bFrOxj4IhxyEbw6IZpkcOkToVNJOagoRCR9qtWETtfAubOhdiE8eBo81Be+SzTdm2QKFYWIpN/OB0D/Z+GIq+CdaTCsNbw2EXJwpohcoKIQkTCqVoMOl8CAF6BBC3jsPLj/JPj649DJpBQVhYiEVbgHnP10NG35hy/B8Dbw8l2aZDCDqChEJLwqVeHg86JDaZscBNMugXu6wefLQicTVBQikknq7Qp9HoMew2HNWzCiPcy9VZMMBqaiEJHMYgYHnAaDF8Lvj4LZf4fRR8Cq10Mny1sqChHJTNvtCH+8D04ZD2tXwaiOMPta+Pmn0MnyjopCRDJbyx7RFOb79YK5/4Y7D4WP5odOlVdUFCKS+WrVh57D4fRHoy2KsV1g2qXRhIOSckGKwszqm9lMM1sW/1qvjHEXmdkSM3vTzCaYWY10ZxWRDLL7kdGRUa37w8ujokkGl88OnSrnhdqiGArMdvcWwOz4418xs8bABUDM3fcBqgK90ppSRDLPNttCt5ujcy8KtoH7ToDHB8EPX4ZOlrNCFUUPYFz8/jigZxnjCoCaZlYA1AI+TUM2EckGv2sTndV96MXR9B/DDoa3JodOlZNCFcWO7r4KIP61YekB7v4J8C/gI2AV8I27zyjrBc2sv5kVmVlRcXFximKLSEapVgOOvBr6Pwfb7QQPnQEP9oFvV4dOllNSVhRmNiv+2ULpW49yfn89oi2PZsDOQG0zO72s8e4+yt1j7h4rLCysnP8IEckOjfaFc5+JZqZ9d3o0yeAr92uSwUqSsqJw907uvk+C22RgtZk1Aoh/TTTHcCdghbsXu/vPwKNAu1TlFZEsV7VadK2LgS9Cw71g8iC493j46sPQybJeqF1PU4C+8ft9gUQ7Fj8C2phZLTMz4EhgaZryiUi22qEFnDkNuv0LVi6MjoxacKcmGayAUEVxI9DZzJYBneOPMbOdzWwagLsvACYBi4E34llHhYkrIlmlShVofW50KO2ubeGpS+HuLlD8TuhkWck8B/fhxWIxLyoqCh1DRDKBO7z+IDw9FNZ/D4ddBu0vjHZVyf8xs0XuHku0TGdmi0huM4um/xj8Mux5DDxzHdx1OHz6auhkWUNFISL5YduGcPI98Mf7o2t033UEzLoGfv4xdLKMp6IQkfyy17HRJIP7nwov/AdGHgIfzgudKqOpKEQk/9SsBz3ugD6Pw8b1cHdXePJiWPdt6GQZSUUhIvlrt8Nh0HxoMwgWjoFhbWDZzNCpMo6KQkTyW/Xa0OWf0G9GdP/+k+DR8zTJYAkqChERgF1aw4C50OFSeHNSNA3Iksc0DQgqChGR/69gGzjiCug/B+o0hofPhAdPjy7FmsdUFCIipe20D5wzGzpfC8tnRVOYLx6ft1sXKgoRkUSqFkRncA+cFxXHlPNhfA/4ckXoZGmnohARSabBbtD3CTjmVvhkMYxoBy8Nh00bQydLGxWFiMjmVKkCB/WDwfOh6SEw/XIYezSseTt0srRQUYiIlNf2TeDUh+CE0fDFe3DnoTDnZtiwPnSylFJRiIhsCTPY92QYshD2Og6e/QeM6gifLAqdLGVUFCIiW6P2DnDSWOg1AX78EkZ3ghlXwfofQierdCoKEZGK2LNbNMngAX1g3u0wsj188ELoVJVKRSEiUlE1tofut8MZU8A3wT3HwBMXwU9rQyerFEGKwsxONrMlZrbJzBJeUSk+rouZvWNmy81saDoziohsseaHwcCXoO0QWHQPDG8D704PnarCQm1RvAmcADxf1gAzqwoMA7oCLYHeZtYyPfFERLZS9Vpw9D+g36xoS+OBU+CRc+D7z0Mn22pBisLdl7r75q5y3hpY7u7vu/t6YCLQI/XpREQqQZMDozmjOl4OSx6PJhl8Y1JWTgOSyZ9RNAY+LvF4Zfy5hMysv5kVmVlRcXFxysOJiGxWQXXoOBTOex7qNYVH+sGE3rD209DJtkjKisLMZpnZmwlu5d0qsATPlVnF7j7K3WPuHissLNy60CIiqbBjS+g3E476B7z/XDTJ4KJ7smbroiBVL+zunSr4EiuBXUo8bgJkVw2LiPyiSlVoNyQ6nHbKBTD1wmhXVPfboX7z0OmSyuRdTwuBFmbWzMyqA72AKYEziYhUTP3m0HcqHPdfWPUaDG8H8/6X0ZMMhjo89ngzWwm0BZ40s+nx53c2s2kA7r4BGAJMB5YCD7n7khB5RUQqlRkceGZ0ol7zjjDjyujM7tVvBQ6WmHmW7CPbErFYzIuKikLHEBHZPHdY8ihMuxR++gYOvTi6FVRPawwzW+TuCc9ry+RdTyIiuc8M9jkRBr8Mex8Pc26EOzvAysyZZFBFISKSCWo3gBPviqYxX7cWxnSC6VdkxCSDKgoRkUzy+6Nh0PzoM4yX7oARbWFFmZNYpIWKQkQk09SoA8f+B858EqwKjDsuOqT2x6+DxFFRiIhkqqaHwMB50P5CeOXeaJLBt6elPYaKQkQkk1WrCZ2vhXNmQ836MLE3PHwWfJe+qYpUFCIi2aBxK+j/HBx+Jbz9RDTJ4OsPpWUaEBWFiEi2KKgOh/0FzpsLDXaDR8+FB/4I36xM6duqKEREsk3DPeHs6dDlRvhgLgxrAwvHwKZNKXk7FYWISDaqUhXaDIRBL0XXvnjyzzDuWFj/faW/VcpmjxURkTSo1xT6PA6v3AcfL4DqtTPt0e8AAAXMSURBVCv9LVQUIiLZzgxa9YluKaBdTyIikpSKQkREklJRiIhIUioKERFJSkUhIiJJqShERCQpFYWIiCSlohARkaTM0zDzYLqZWTHw4VZ++w7A55UYp7Io15bL1GzKtWWUa8ttTbZd3b0w0YKcLIqKMLMid4+FzlGacm25TM2mXFtGubZcZWfTricREUlKRSEiIkmpKH5rVOgAZVCuLZep2ZRryyjXlqvUbPqMQkREktIWhYiIJKWiEBGRpPKyKMysi5m9Y2bLzWxoguVmZrfHl79uZq3SlGsXM3vWzJaa2RIzuzDBmI5m9o2ZvRq/XZ2mbB+Y2Rvx9yxKsDzt68zM9iixHl41s7Vm9qdSY9K2vsxsrJmtMbM3SzxX38xmmtmy+Nd6ZXxv0t/JFOS6xczejv+sHjOzumV8b9KfewpyXWNmn5T4eXUr43vTvb4eLJHpAzN7tYzvTeX6Svj3IS2/Y+6eVzegKvAe0ByoDrwGtCw1phvwFGBAG2BBmrI1AlrF728HvJsgW0fgiQDr7QNghyTLg6yzUj/Xz4hOGgqyvoAOQCvgzRLP3QwMjd8fCtxURvakv5MpyHUUUBC/f1OiXOX5uacg1zXAJeX4Wad1fZVa/m/g6gDrK+Hfh3T8juXjFkVrYLm7v+/u64GJQI9SY3oA4z0yH6hrZo1SHczdV7n74vj9b4GlQONUv28lCbLOSjgSeM/dt/aM/Apz9+eBL0s93QMYF78/DuiZ4FvL8ztZqbncfYa7b4g/nA80qaz3q0iuckr7+vqFmRlwCjChst6vvJL8fUj571g+FkVj4OMSj1fy2z/G5RmTUmbWFDgAWJBgcVsze83MnjKzvdMUyYEZZrbIzPonWB56nfWi7H+8IdbXL3Z091UQ/UMHGiYYE3rdnU20NZjI5n7uqTAkvktsbBm7UUKur0OB1e6+rIzlaVlfpf4+pPx3LB+LwhI8V/oY4fKMSRkz2xZ4BPiTu68ttXgx0e6V/YD/AY+nKVZ7d28FdAUGm1mHUsuDrTMzqw50Bx5OsDjU+toSIdfdFcAG4P4yhmzu517ZRgC7AfsDq4h285QW8t9nb5JvTaR8fW3m70OZ35bguXKvs3wsipXALiUeNwE+3YoxKWFm1Yh+Ce5390dLL3f3te7+Xfz+NKCame2Q6lzu/mn86xrgMaJN2ZKCrTOif5SL3X116QWh1lcJq3/ZBRf/uibBmCDrzsz6AscCp3l8R3Zp5fi5Vyp3X+3uG919E3BXGe8Xan0VACcAD5Y1JtXrq4y/Dyn/HcvHolgItDCzZvH/E+0FTCk1ZgpwRvxInjbAN79s2qVSfP/nGGCpu99axpid4uMws9ZEP8MvUpyrtplt98t9og9C3yw1LMg6iyvz//JCrK9SpgB94/f7ApMTjCnP72SlMrMuwGVAd3f/oYwx5fm5V3aukp9rHV/G+6V9fcV1At5295WJFqZ6fSX5+5D637FUfDqf6TeiI3TeJToK4Ir4cwOAAfH7BgyLL38DiKUp1yFEm4OvA6/Gb91KZRsCLCE6amE+0C4NuZrH3++1+Htn0jqrRfSHf/sSzwVZX0RltQr4mej/4PoBDYDZwLL41/rxsTsD05L9TqY413Kifda//J6NLJ2rrJ97inPdG//9eZ3oD1mjTFhf8efv+eX3qsTYdK6vsv4+pPx3TFN4iIhIUvm460lERLaAikJERJJSUYiISFIqChERSUpFISIiSakoREQkKRWFiIgkpaIQSTEzOyg+yV2N+Nm7S8xsn9C5RMpLJ9yJpIGZXQ/UAGoCK939n4EjiZSbikIkDeLz6ywEfiKaRmRj4Egi5aZdTyLpUR/YlujKZDUCZxHZItqiEEkDM5tCdFWxZkQT3Q0JHEmk3ApCBxDJdWZ2BrDB3R8ws6rAPDM7wt2fCZ1NpDy0RSEiIknpMwoREUlKRSEiIkmpKEREJCkVhYiIJKWiEBGRpFQUIiKSlIpCRESS+n/SMZXvLHDqOwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pylab as plt\n",
    "\n",
    "def tangent_line(f, x): # 切线\n",
    "    d = numerical_diff(f, x)\n",
    "    print(d)\n",
    "    y = f(x) - d*x\n",
    "    return lambda t: d*t + y\n",
    "     \n",
    "x = np.arange(0.0, 20.0, 0.1)\n",
    "y = function_1(x)\n",
    "plt.xlabel(\"x\")\n",
    "plt.ylabel(\"f(x)\")\n",
    "\n",
    "tf = tangent_line(function_1, 5) # 切线\n",
    "y2 = tf(x)\n",
    "\n",
    "plt.plot(x, y)\n",
    "plt.plot(x, y2)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 偏导数\n",
    "我们定义这个函数：$f(x_0,x_1) = x_0^2 + x_1^2$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "def function_2(x):\n",
    "    return x[0]**2 + x[1]**2\n",
    "    # 或者 return np.sum(x**2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们来画一下这个函数的图像。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "from mpl_toolkits.mplot3d import Axes3D # 此模块并非不用，如果缺少了会引起三维坐标的创建ValueError: Unknown projection '3d\n",
    "import numpy as np\n",
    "\n",
    "plt.figure()\n",
    "ax = plt.axes(projection=\"3d\")\n",
    "\n",
    "x = np.arange(-5.0, 5.0, 0.1) # 以0.1为单位，从-5到5的数组x\n",
    "y = np.arange(-5.0, 5.0, 0.1)\n",
    "X,Y = np.meshgrid(x,y)    # 生成绘制3D图形所需的网络数据\n",
    "Z = X**2+Y**2\n",
    "\n",
    "ax.plot_surface(X,Y,Z,alpha=0.5,cmap=\"winter\") #生成表面，alpha用于控制透明度\n",
    "#ax.contour(X,Y,Z,zdir=\"x\",offset=-6,cmap=\"rainbow\")   #x轴投影\n",
    "#ax.contour(X,Y,Z,zdir=\"y\",offset=6,cmap=\"rainbow\")    #y轴投影\n",
    "#ax.contour(X,Y,Z,zdir=\"z\",offset=-3,cmap=\"rainbow\")   #z轴投影\n",
    "ax.set_xlabel(\"X\")  #设置X、Y、Z 坐标范围\n",
    "ax.set_xlim(-6,6)   #设置X、Y、Z 轴\n",
    "ax.set_ylabel(\"Y\")\n",
    "ax.set_ylim(-6,6)\n",
    "ax.set_zlabel(\"Z\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来，我们对这个式子求导。<br>\n",
    "我们把有多个变量的函数的导数称为**偏导数**，用数学式表示的话，可以写成$\\frac{\\partial f}{\\partial x_0}$、$\\frac{\\partial f}{\\partial x_1}$。\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-2.5e+50"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 问题1：求 x0=3,x1=4 时，关于x0的偏导数。\n",
    "def function_tmp1(x0):\n",
    "    return x0*x0 + 4.0**2.0 # x0^2 + x1^2\n",
    "\n",
    "numerical_diff(function_tmp1, 3.0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7.999999999999119"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 问题2：求 x0=3,x1=4 时，关于x1的偏导数。\n",
    "def function_tmp2(x1):\n",
    "    return 3.0**2.0 + x1*x1 # x0^2 + x1^2\n",
    "\n",
    "numercial_diff(function_tmp2, 4.0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "像这样，偏导数和单变量的导数一样，都是求某个地方的斜率。不过，偏导数需要将多个变量中的某一个变量定为目标变量，并将其他变量固定为某个值。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 梯度\n",
    "刚才的例子中，我们按变量分别计算了x0和x1的偏导数。现在，我们希望一起计算x0和x1的偏导数。<br>\n",
    "我们来考虑求 $x_0=3$,$x_1=4$ 时 $(x_0,x_1)$ 的偏导数 $(\\frac{\\partial f}{\\partial x_0},\\frac{\\partial f}{\\partial x_1})$。<br>\n",
    "另外，像 $(\\frac{\\partial f}{\\partial x_0},\\frac{\\partial f}{\\partial x_1})$ 这样的由全部变量的偏导数汇总而成的向量称为**梯度**(gradient)。<br>\n",
    "梯度可以像下面这样来实现。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "def numerical_gradient(f, x):\n",
    "    h = 1e-4 # 0.0001\n",
    "    grad = np.zeros_like(x) # np.zeros.like(x)会生成一个形状和x相同、所有元素都为0的数组。\n",
    "    \n",
    "    for index in range(x.size): # x.size 为变量个数\n",
    "        tmp_val = x[index] # 用来暂时保存x[index]的值\n",
    "        \n",
    "        # f(x+h)的计算\n",
    "        x[index] = tmp_val + h\n",
    "        fxh1 = f(x)\n",
    "        \n",
    "        # f(x-h)的计算\n",
    "        x[index] = tmp_val - h\n",
    "        fxh2 = f(x)\n",
    "        \n",
    "        grad[index] = (fxh1 - fxh2) / (2*h) # (f(x+h)-f(x-h)) / 2*h\n",
    "        \n",
    "        x[index] = tmp_val # 还原值\n",
    "                \n",
    "    return grad"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "numercial_gradient(f, x)中，参数 f 为函数，x为 NumPy 数组，该函数对 NumPy 数组 x 的各个元素求数值微分。\n",
    "\n",
    "现在，我们用这个函数实际计算一下梯度。这里我们求点(3,4)、(0,2)、(3,0)处的梯度。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([6., 8.])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "numerical_gradient(function_2, np.array([3.0, 4.0]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 4.])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "numerical_gradient(function_2, np.array([0.0, 2.0]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([6., 0.])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "numerical_gradient(function_2, np.array([3.0, 0.0]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们画出元素值为负梯度的向量。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No handles with labels found to put in legend.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# coding: utf-8\n",
    "# cf.http://d.hatena.ne.jp/white_wheels/20100327/p3\n",
    "import numpy as np\n",
    "import matplotlib.pylab as plt\n",
    "from mpl_toolkits.mplot3d import Axes3D\n",
    "\n",
    "\n",
    "def _numerical_gradient_no_batch(f, x):\n",
    "    h = 1e-4 # 0.0001\n",
    "    grad = np.zeros_like(x)\n",
    "    \n",
    "    for idx in range(x.size):\n",
    "        tmp_val = x[idx]\n",
    "        x[idx] = float(tmp_val) + h\n",
    "        fxh1 = f(x) # f(x+h)\n",
    "        \n",
    "        x[idx] = tmp_val - h \n",
    "        fxh2 = f(x) # f(x-h)\n",
    "        grad[idx] = (fxh1 - fxh2) / (2*h)\n",
    "        \n",
    "        x[idx] = tmp_val # 还原值\n",
    "        \n",
    "    return grad\n",
    "\n",
    "\n",
    "def numerical_gradient(f, X):\n",
    "    if X.ndim == 1:\n",
    "        return _numerical_gradient_no_batch(f, X)\n",
    "    else:\n",
    "        grad = np.zeros_like(X)\n",
    "        \n",
    "        for idx, x in enumerate(X):\n",
    "            grad[idx] = _numerical_gradient_no_batch(f, x)\n",
    "        \n",
    "        return grad\n",
    "\n",
    "\n",
    "def function_2(x):\n",
    "    if x.ndim == 1:\n",
    "        return np.sum(x**2)\n",
    "    else:\n",
    "        return np.sum(x**2, axis=1)\n",
    "\n",
    "\n",
    "def tangent_line(f, x):\n",
    "    d = numerical_gradient(f, x)\n",
    "    print(d)\n",
    "    y = f(x) - d*x\n",
    "    return lambda t: d*t + y\n",
    "     \n",
    "if __name__ == '__main__':\n",
    "    x0 = np.arange(-2, 2.5, 0.25)\n",
    "    x1 = np.arange(-2, 2.5, 0.25)\n",
    "    X, Y = np.meshgrid(x0, x1)\n",
    "    \n",
    "    X = X.flatten()\n",
    "    Y = Y.flatten()\n",
    "    \n",
    "    grad = numerical_gradient(function_2, np.array([X, Y]) )\n",
    "    \n",
    "    plt.figure()\n",
    "    plt.quiver(X, Y, -grad[0], -grad[1],  angles=\"xy\",color=\"#666666\")#,headwidth=10,scale=40,color=\"#444444\")\n",
    "    plt.xlim([-2, 2])\n",
    "    plt.ylim([-2, 2])\n",
    "    plt.xlabel('x0')\n",
    "    plt.ylabel('x1')\n",
    "    plt.grid()\n",
    "    plt.legend()\n",
    "    plt.draw()\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如图所示，$f(x_0,x_1) = x_0^2 + x_1^2$ 的梯度呈现为有向向量(箭头)。观察图，我们发现梯度指向函数$f(x_0,x_1)$的“最低处”(最小值)，所有的箭头都指向同一点。其次，我们发现离“最低处”越远，箭头越大。\n",
    "\n",
    "虽然图中的梯度指向了最低处，单并非任何时候都这样。实际上，梯度会指向各点处的函数值降低的地方。更严格的讲，**梯度指示的方向是各点处函数值减小最多的方向**。这是一个非常重要的性质，一定要牢记！"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 梯度法\n",
    "机器学习的主要任务就是在学习时寻找最优参数。同样地，神经网络也必须在学习时找到最优参数(权重和偏置)。这里所述ode最优参数是指损失函数取最小值时的参数。一般而言，损失函数很复杂，参数空间庞大，我们不知道它在何处能取得最小值。巧妙地使用梯度来寻找函数最小值（或者尽可能小的值）的方法就是梯度法。\n",
    "\n",
    "需要注意的是，梯度表示的是各点处的函数值减小最多的方向。因此，无法保证梯度所指的方向就是函数的最小值或真正应该前进的方向。实际上，在复杂的函数中，梯度指示的方向基本上都不是函数值最小处。\n",
    "\n",
    "虽然梯度的方向并不一定指向最小值，但沿着它的方向能够最大限度地减小函数的值。因此，在寻找函数的最小值的位置的任务中，要以梯度的信息为线索，决定前进的方向。\n",
    "\n",
    "在梯度法中，函数的取值从当前位置沿着梯度方向前进一定距离，然后在新的地方重新求梯度，再沿着新梯度方向前进，如此反复，不断地沿梯度方向前进。像这样，通过不断地沿着梯度方向前进，逐渐减小函数值的过程就是**梯度法**(gradient method)。梯度法是解决机器学习中最优化问题的常用方法，特别是在神经网络的学习中经常被使用。\n",
    "\n",
    "根据目的是寻找最小值还是最大值，梯度法的叫法有所不同。严格地讲，寻找最小值的梯度法称为**梯度下降法**(gradient descent method)，寻找最大值的梯度法称为**梯度上升法**(gradient descent method)。但是通过**反转损失函数的符号**，求最小值的问题和求最大值的问题会变成相同的问题，因此“下降”还是“上升”的差异本质上并不重要。一般来说，神经网络(深度学习)中，梯度法主要是指梯度下降法。\n",
    "\n",
    "\n",
    "现在，我们尝试用数学式来表示梯度法，如下式所示。\n",
    "\n",
    "$$\n",
    "x_0 = x_0 - \\eta  \\frac {\\partial f}{\\partial x_0}\n",
    "$$\n",
    "$$\n",
    "x_0 = x_0 - \\eta  \\frac {\\partial f}{\\partial x_1}\n",
    "$$\n",
    "\n",
    "\n",
    "上式的 $\\eta$ 表示更新量，在神经网络的学习中，称为**学习率**(learning rate)。学习率决定在一次学习中，应该学习多少，以及在多大程度上更新参数。\n",
    "\n",
    "上式是表示更新一次的式子，这个步骤会反复执行。也就是说，每一步都按此式更新变量的值，通过反复执行此步骤，逐渐减小函数值。虽然这里只展示了有两个变量时的更新过程，但是即便增加变量的数量，也可以通过类似的式子(各个变量的偏导数)进行更新。\n",
    "\n",
    "学习率需要事先确定为某个值，比如0.01或0.001。一般而言，这个值过大或过小，都无法抵达一个“好的位置”。在神经网络的学习中，一般会一边改变学习率的值，一边确认学习是否正确进行了。\n",
    "\n",
    "\n",
    "我们用 Python 来实现梯度下降算法。如下，这个实现很简单。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradient_descent(f, init_x, lr=0.01, step_num=100): # 梯度下降算法\n",
    "    x = init_x\n",
    "    \n",
    "    for i in range(step_num):\n",
    "        grad = numerical_gradient(f, x)\n",
    "        x -= lr * grad\n",
    "    \n",
    "    return x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "参数 f 是要进行最优化的函数，init_x 是初始值，lr 是学习率 learning_rate，step_num 是梯度法的重复次数。<br>\n",
    "numercial_gradient(f, x)会求函数的梯度，用该梯度乘以学习率得到的值进行更新操作，由 step_num 指定重复次数。\n",
    "\n",
    "使用这个函数可以求函数的极小值，顺利的话，还可以求函数的最小值。下面，我们就来尝试解决这个问题。\n",
    "\n",
    "**问题:** 请用梯度法求 $f(x_0 + x_1) = x_0^2 + x_1^2$ 的最小值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [],
   "source": [
    "def function_2(x):\n",
    "    return x[0]**2 + x[1]**2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-6.11110793e-10,  8.14814391e-10])"
      ]
     },
     "execution_count": 127,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "init_x = np.array([-3.0, 4.0])\n",
    "gradient_descent(function_2, init_x=init_x, lr=0.1, step_num=100)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这里，设初始值为(-3.0,4.0)，开始使用梯度法寻找最小值。最终的结果是(-6.1e-10, 8.1e-10)，非常接近(0,0)。实际上，真的最小值就是(0,0)，所以说通过梯度法我们基本得到了正确结果。\n",
    "\n",
    "用图来表示梯度法的更新过程，如下图所示。可以发现，原点处是最低的地方，函数的取值一点点在向其靠近。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pylab as plt\n",
    "\n",
    "def gradient_descent(f, init_x, lr=0.01, step_num=100): # 梯度下降算法\n",
    "    x = init_x\n",
    "    x_history = []\n",
    "\n",
    "    for i in range(step_num):\n",
    "        x_history.append( x.copy() )\n",
    "\n",
    "        grad = numerical_gradient(f, x)\n",
    "        x -= lr * grad\n",
    "\n",
    "    return x, np.array(x_history)\n",
    "\n",
    "\n",
    "def function_2(x): # 定义的函数\n",
    "    return x[0]**2 + x[1]**2\n",
    "\n",
    "init_x = np.array([-3.0, 4.0])    \n",
    "\n",
    "lr = 0.1\n",
    "step_num = 20\n",
    "x, x_history = gradient_descent(function_2, init_x, lr=lr, step_num=step_num)\n",
    "\n",
    "plt.plot( [-5, 5], [0,0], '--b')\n",
    "plt.plot( [0,0], [-5, 5], '--b')\n",
    "plt.plot(x_history[:,0], x_history[:,1], 'o')\n",
    "\n",
    "plt.xlim(-3.5, 3.5)\n",
    "plt.ylim(-4.5, 4.5)\n",
    "plt.xlabel(\"X0\")\n",
    "plt.ylabel(\"X1\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "前面说过，学习率过大或者过小都无法得到好的结果。我们来做个试验验证一下。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-2.58983747e+13, -1.29524862e+12])"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 学习率过大的例子：lr=10.0\n",
    "init_x = np.array([-3.0, 4.0])\n",
    "gradient_descent(function_2, init_x=init_x, lr=10.0, step_num=100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-2.99999994,  3.99999992])"
      ]
     },
     "execution_count": 136,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 学习率过小的例子：lr=1e-10\n",
    "init_x = np.array([-3.0, 4.0])\n",
    "gradient_descent(function_2, init_x=init_x, lr=1e-10, step_num=100)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "实验结果表明，学习率过大的话，会发散成一个很大的值；反过来，学习率过小的话，基本上没怎么更新就结束了。**设定合适的学习率是一个很重要的问题**。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "像学习率这样的参数称为**超参数**。这是一种和神经网络的参数(权重和偏置)性质不同的参数。相对于神经网络的权重参数是通过训练数据和学习算法自动获得的，学习率这样的超参数则是人工设定的。一般来说，超参数需要尝试多个值，以便找到一种可以使学习顺利进行的设定。\n",
    "\n",
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 神经网络的梯度\n",
    "神经网络的学习也要求梯度。这里所说的梯度是指损失函数关于权重参数的梯度。<br>\n",
    "比如，有一个只有一个形状为 $2x3$ 的权重 $W$ 的神经网络，损失函数用 $L$ 表示。此时，梯度可以用$\\frac{\\partial L}{\\partial W}$表示。用数学式表示的话，如下所示。\n",
    "$$\n",
    "W = \\begin{pmatrix}\n",
    " w_{11} & w_{12} & w_{13} \\\\ \n",
    " w_{21} & w_{22} & w_{23} \n",
    "\\end{pmatrix}\n",
    "$$\n",
    "$$\n",
    "\\frac{\\partial L}{\\partial W} = \\begin{pmatrix}\n",
    " \\frac{\\partial L}{\\partial w_{11}} & \\frac{\\partial L}{\\partial w_{12}} & \\frac{\\partial L}{\\partial w_{13}} \\\\ \n",
    " \\frac{\\partial L}{\\partial w_{21}} & \\frac{\\partial L}{\\partial w_{22}} & \\frac{\\partial L}{\\partial w_{23}} \n",
    "\\end{pmatrix}\n",
    "$$\n",
    "\n",
    "$\\frac{\\partial L}{\\partial W}$的元素由各个元素关于$W$的偏导数构成。比如，第1行第1列的元素$\\frac{\\partial L}{\\partial w_{11}}$表示当$w_{11}$稍微变化时，损失函数$L$会发生多大变化。<br>\n",
    "这里的重点是，$\\frac{\\partial L}{\\partial W}$的形状和$W$相同。\n",
    "\n",
    "下面，我们以一个简单的神经网络为例，为实现求梯度的代码。为此，我们实现一个名为 simpleNet 的类。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys, os\n",
    "sys.path.append(os.pardir)\n",
    "import numpy as np\n",
    "from common.functions import softmax, cross_entropy_error\n",
    "# from common.gradient import numerical_gradient\n",
    "\n",
    "def numerical_gradient(f, x): # 为了对应多维数组，较上面稍有修改\n",
    "    h = 1e-4 # 0.0001\n",
    "    grad = np.zeros_like(x)\n",
    "    \n",
    "    it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])\n",
    "    while not it.finished:\n",
    "        idx = it.multi_index\n",
    "        tmp_val = x[idx]\n",
    "        x[idx] = float(tmp_val) + h\n",
    "        fxh1 = f(x) # f(x+h)\n",
    "        \n",
    "        x[idx] = tmp_val - h \n",
    "        fxh2 = f(x) # f(x-h)\n",
    "        grad[idx] = (fxh1 - fxh2) / (2*h)\n",
    "        \n",
    "        x[idx] = tmp_val # 还原值\n",
    "        it.iternext()   \n",
    "        \n",
    "    return grad\n",
    "\n",
    "\n",
    "class simpleNet:\n",
    "    def __init__(self):\n",
    "        self.W = np.random.randn(2,3) # 用高斯分布进行初始化\n",
    "        \n",
    "    def predict(self, x):\n",
    "        return np.dot(x, self.W)\n",
    "    \n",
    "    def loss(self, x, t):\n",
    "        z = self.predict(x)\n",
    "        y = softmax(z)\n",
    "        loss = cross_entropy_error(y, t)\n",
    "        \n",
    "        return loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-1.19285797, -0.95887496, -0.24315246],\n",
       "       [ 1.71913234, -0.37777499, -0.26465635]])"
      ]
     },
     "execution_count": 165,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "net = simpleNet()\n",
    "net.W # 权重参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 166,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.83150432, -0.91532247, -0.3840822 ])"
      ]
     },
     "execution_count": 166,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.array([0.6, 0.9])\n",
    "p = net.predict(x)\n",
    "p"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 167,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.argmax(p) # 最大值的索引"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 168,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.6014348354397954"
      ]
     },
     "execution_count": 168,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t = np.array([0, 0, 1]) # 正确的标签\n",
    "net.loss(x, t)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来求梯度。和前面一样，我们使用 numerical_gradient(f, x) 求梯度（ 这里定义的函数 f(W) 的参数 W 是一个伪参数。因为  numerical_gradient(f,x) 会在内部执行 f(x)，为了与之兼容而定义了 f(W) ）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "metadata": {},
   "outputs": [],
   "source": [
    "def f(W):\n",
    "    return net.loss(x, t)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.40792378,  0.07111182, -0.4790356 ],\n",
       "       [ 0.61188567,  0.10666773, -0.7185534 ]])"
      ]
     },
     "execution_count": 172,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dW = numerical_gradient(f, net.W)\n",
    "dW"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们设 dW 的值为 $[[0.21924763 \\ 0.14356247 \\ -0.36281009] \\\\ [0.32887144 \\ 0.2153437 \\ -0.54421514]]$\n",
    "\n",
    "观察一下 dW 的内容，会发现$\\frac {\\partial L}{\\partial w_{11}}$ 的值大约为0.2，这表示如果 $\\frac {\\partial L}{\\partial w_{11}}$ 增加 h，那么损失函数的值将会增加 0.2h。再如，$\\frac {\\partial L}{\\partial w_{23}}$对应的值大约是$-0.5$，这表示如果将$w_{23}$增加 h，损失函数的值将减少 0.5h。因此，从减小损失函数值的观点来看，$w_{23}$应该向正方向更新，$w_{11}$应该向负方向更新。至于更新的程度，$w_{23}$比$w_{11}$的贡献要大。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### lambda表示法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 175,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 一般定义函数\n",
    "def f(W):\n",
    "    return net.loss(x, t)\n",
    "\n",
    "# lambda 表达式\n",
    "f = lambda w: net.loss(x, t)\n",
    "dW = numerical_gradient(f, net.W)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "求出神经网络的梯度后，接下来只需要根据梯度法，更新权重参数即可。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
